<!DOCTYPE html>



  


<html class="theme-next pisces use-motion" lang="">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>
<meta name="theme-color" content="#222">









<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />
















  
  
  <link href="/blog/lib/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css" />







<link href="/blog/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/blog/css/main.css?v=5.1.4" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/blog/images/apple-touch-icon-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="32x32" href="/blog/images/favicon-32x32-next.png?v=5.1.4">


  <link rel="icon" type="image/png" sizes="16x16" href="/blog/images/favicon-16x16-next.png?v=5.1.4">


  <link rel="mask-icon" href="/blog/images/logo.svg?v=5.1.4" color="#222">





  <meta name="keywords" content="Hexo, NexT" />










<meta name="description" content="一、  创建一个对象，内存是如何分配 1). 子类对象中有自己的属性和所有父类的属性 2). 代码段中每一个类都有一个isa指针，这个指针指向它的父类.">
<meta name="keywords" content="Android、iOS、Web、React Native">
<meta property="og:type" content="article">
<meta property="og:title" content="Objective-C-学习第五天">
<meta property="og:url" content="http://yoursite.com/blog/2018/08/06/Object-C/Objective-C-学习第五天/index.html">
<meta property="og:site_name" content="凌浩雨_博客">
<meta property="og:description" content="一、  创建一个对象，内存是如何分配 1). 子类对象中有自己的属性和所有父类的属性 2). 代码段中每一个类都有一个isa指针，这个指针指向它的父类.">
<meta property="og:locale" content="default">
<meta property="og:image" content="http://upload-images.jianshu.io/upload_images/3110861-4cbc535c0386bf29.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240">
<meta property="og:updated_time" content="2018-08-06T10:34:52.192Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Objective-C-学习第五天">
<meta name="twitter:description" content="一、  创建一个对象，内存是如何分配 1). 子类对象中有自己的属性和所有父类的属性 2). 代码段中每一个类都有一个isa指针，这个指针指向它的父类.">
<meta name="twitter:image" content="http://upload-images.jianshu.io/upload_images/3110861-4cbc535c0386bf29.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240">



<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/blog/',
    scheme: 'Pisces',
    version: '5.1.4',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: true,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    duoshuo: {
      userId: '0',
      author: 'Author'
    },
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>



  <link rel="canonical" href="http://yoursite.com/blog/2018/08/06/Object-C/Objective-C-学习第五天/"/>





  <title>Objective-C-学习第五天 | 凌浩雨_博客</title>
  








</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="default">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/blog/"  class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">凌浩雨_博客</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle"></p>
      
  </div>

  <div class="site-nav-toggle">
    <button>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        <li class="menu-item menu-item-home">
          <a href="/blog/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-home"></i> <br />
            
            Home
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/blog/archives/" rel="section">
            
              <i class="menu-item-icon fa fa-fw fa-archive"></i> <br />
            
            Archives
          </a>
        </li>
      

      
    </ul>
  

  
</nav>



 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://yoursite.com/blog/blog/2018/08/06/Object-C/Objective-C-学习第五天/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="凌浩雨">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/blog/images/avatar.jpeg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="凌浩雨_博客">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">Objective-C-学习第五天</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">Posted on</span>
              
              <time title="Post created" itemprop="dateCreated datePublished" datetime="2018-08-06T18:01:39+08:00">
                2018-08-06
              </time>
            

            

            
          </span>

          

          
            
          

          
          

          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <p>一、</p>
<ol>
<li>创建一个对象，内存是如何分配<br> 1). 子类对象中有自己的属性和所有父类的属性<br> 2). 代码段中每一个类都有一个isa指针，这个指针指向它的父类.</li>
</ol>
<a id="more"></a>
<ol start="2">
<li><p>结构体与类<br> 1) 相同点: 都可以将多个数据封装为1个整体</p>
 <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">struct Data&#123;</span><br><span class="line">	int year;</span><br><span class="line">	int month;</span><br><span class="line">	int day;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">@interface Data : NSObject&#123;</span><br><span class="line">	int year;</span><br><span class="line">	int month;</span><br><span class="line">	int day;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p> 2). 不同点: </p>
<pre><code>a. 结构体只能封装数据，而类不仅可以封装数据还可以封装行为
b. 结构体变量分配在栈空间(前提是局部变量),而对象分配在堆空间. 
栈空间相对较小,但是访问效率高;
 堆空间较大, 访问效率低.
</code></pre><p> 3). 应用场景: </p>
<pre><code>a. 如果表示的实体不仅有数据还有行为,只能使用类
b. 如果表示的实体只有数据, 没有行为，视属性多少而定.如果属性只有几个，就定义为结构体; 如果属性较多，就定义为类.
</code></pre></li>
<li><p>类的本质<br> 栈<br> 堆<br> BSS段<br> 数据段<br> 代码段<br><img src="http://upload-images.jianshu.io/upload_images/3110861-4cbc535c0386bf29.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="内存.png"></p>
<p> 代码段是用来存储代码的.<br> 类加载，当类第一次被访问的时候，这个类就会被加载到代码段存储起来.<br> 类一旦被加载，是不会被回收的，除非程序结束.</p>
<p> 1). 任何存储在内存中的数据都有1个数据类型.<br> 2). 在代码段存储类的步骤</p>
<pre><code>a. 先在代码段中创建Class对象, Class是Foundation框架中的一个类
b. 将类的信息存储在这个Class对象之中
    Class对象至少有三个属性:
        类名/属性s/方法s
存储类的这个Class对象,叫做类对象
所以存储类的类对象也有一个isa指针
</code></pre></li>
<li><p>类对象使用<br> 1). 调用类的类方法class，就可以了得到存储类的类对象的地址</p>
<pre><code>Class c1 = [Person class];
</code></pre><p> 2). 调用对象的对象方法，就可以了得到这个对象所属的类的Class对象的地址.</p>
<pre><code>Person *p1 = [Person new];
Class c2 = [p1 class];
</code></pre><p> 注意: 声明Class指针的时候，不需要加<em>，因为typedef的时候就已经加</em>了.<br> 3). 拿到存储类的类对象以后</p>
<pre><code>Class c1 = [Person class];
c1对象就是Person类, c1 完全等价于Person
a. 使用类对象来调用类的类方法,
    Class c1 = [Person class];
    [c1 sayHi] 等价于 [Person sayHi];
b. 创建对象
    Class c1 = [Person class];
    [c1 new] 等价于 [Person new];
</code></pre><p> 4) 注意: 使用类对象，只能调用类的类方法，不能调用对象方法</p>
</li>
<li><p>SEL全程 select 选择器<br> SEL是一个数据类型. 要在内存中申请空间存储数据，SEL其实是一个类,SEL对象用来存储一个方法<br> 1). 类是以Class对象的形式存储在代码段中</p>
<pre><code>类名: 存储这个类的类名.NSString
a. 如何将方法存储在类对象之中
    a). 先创建一个SEL对象
    b). 将方法的信息存储在这个SEL对象之中
    c). 再将这个SEL作为Class对象的属性 
</code></pre><p> 2). 拿到存储方法的SEL对象</p>
<pre><code>a. 因为SEL是typedef类型的，在自定义的时候已经加*了，所以声明SEL指针的时候不需要加*
b. 取到存储方法的SEL对象
    SEL s1 = @selector(方法名);
    示例:
    SEL s1 = @selector(sayHi);
</code></pre><p> 3). 调用方法的本质</p>
<pre><code>Person p1 = [Person new];
[p1 sayHi];
内部原理:
a. 先拿到存储sayHi方法的SEL对象，也就是拿到sayHi方法的SEL数据，SEL消息
b. 将这个SEL消息发送给p1对象
c. p1对象接收到这个SEL消息之后，就知道调用方法
d. 根据对象的isa指针找到存储类的类对象
e. 如果找到这个类对象之后，搜寻是否有和传入的SEL数据相匹配的，如果有，就执行，如果乜有就找父类，知道NSObject
OC最重要的1个机制: 消息机制
调用方法的本质其实就是为对象发送SEL消息
[p1 sayHi]: 为p1对象发送一个sayHi方法
</code></pre><p> 4). 手动为对象发送SEL消息</p>
<pre><code>a. 先得到方法的SEL数据
b. 把这个SEL数据发送给p1对象
    - (id)performSelector:(SEL)aSelector;
示例:
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Person *p1 = [Person new];</span><br><span class="line">SEL s1 = @selector(sayHi);</span><br><span class="line">[p1 performSelector:sel];</span><br></pre></td></tr></table></figure>

c. 调用一个对象的方法有两种
    a). [对象名 方法名];
    b). 手动的为对象发送SEL消息
</code></pre><p> 5). 注意事项:</p>
<pre><code>a. 如果方法名有参数 那么方法名是带了参数的
b. 如果方法有参数，就调用另外一个方法
- (id)performSelector:(SEL)aSelector withObject:(id)object;
c. 如果方法有多个参数，就将对象传递过去
</code></pre></li>
<li><p>点语法<br> OC中也可以使用点语法来访问对象的属性，和Java,C#是完全不一样的.<br> 1). 使用点语法访问对象的属性.  </p>
<pre><code>语法：对象名.去掉下划线的属性名
`p1.name = @&quot;jack&quot;;`这个时候就会将@&quot;jack&quot;赋值给p1对象的_name属性; `NSString *name = p1.name;`把p1对象的_name属性值取出来
</code></pre><p> 2). 点语法原理</p>
<pre><code>p1.age = 18;
这句话的本质并不是把18直接赋值给p1对象的_age属性，点语法在编译器编译的时候，会将点语法转换为调用setter/getter的代码
a. 当使用点语法赋值的时候，这个时候编译器会将点语法转换为调用setter方法的代码.
    对象名.去掉下划线的属性名 = 数据;
    转换为：
    [对象名 set去掉下划线的属性名首字母大写] = 数据;
    p1.age = 10相当于[p1 setAge:10];
b. 当使用点语法取值的时候，这个时候编译器会将点语法转换为调用getter方法的代码.
    对象名.去掉下划线的属性名;
    转换为:
    [对象名 去掉下划线的属性名];
    int age = p1.ag相当于[p1 age];
</code></pre><p> 3). 注意:</p>
<pre><code>a. 在getter/setter方法中慎用点语法, 因为有可能会造成无线递归导致程序崩溃
b. 点语法在编译器编译的时候会转换为setter/getter方法的代码.
    如果我们的setter和getter方法名不符合规范，那么就会报错.
c. 如果属性没有封装getter/setter是无法使用点语法的
</code></pre></li>
<li><p>@property<br> 1). 写一个类</p>
<pre><code>a. 写属性
b. 声明属性的getter/setter
c. 再实现getter/setter
</code></pre><p> 2). @property</p>
<pre><code>a. 作用: 自动生成getter/setter的声明，应该写在@interface声明之中
b. 语法:
    @property 数据类型 变量名;
    @property int age;
c. 原理:
    编译器在编译的时候，会根据@property生成getter/setter方法的实现
    @property 数据类型 名称;
    生成为:
    - (void)set首字母大写的名称:参数;
    - (数据类型)名称;
    示例:
    @property int age;
    - (void)setAge:(int)age;
    - (int)age;
</code></pre><p> 3). 使用@property注意:</p>
<pre><code>a. @property的类型和属性的类型一致.
   @property的名称和属性名称一致(去掉下划线).
b. @property的名称决定了生成getter和setter方法的名称.
   @property的数据类型决定了生成的getter和setter方法的数据类型.
c. @property只是生成getter和setter方法的声明,实现要自己写.
</code></pre></li>
<li><p>@synthesize<br> 1). 作用: 自动生成getter/setter方法的实现，应该写在类的实现当中<br> 2). 语法:</p>
<pre><code>@synthesize @property名称;
</code></pre> <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">// 声明</span><br><span class="line">@interface Person : NSObject&#123;</span><br><span class="line">	int _age;</span><br><span class="line">&#125;</span><br><span class="line">@property int age;</span><br><span class="line">@end;</span><br><span class="line"></span><br><span class="line">// 实现</span><br><span class="line">@implementation Person</span><br><span class="line">@synthesize age;</span><br><span class="line">@end</span><br></pre></td></tr></table></figure>
<p> 3). @synthesize做的事情</p>
<pre><code>a. 生成一个真私有的属性,属性的类型和@synthesize对应的@property类型一致，属性的名字和@synthesize对应的@property名字一致.
b. 自动生成setter方法的实现
    实现的方式：将参数直接赋值给自动生成的那个私有属性.并且没有做任何的逻辑验证
c. 自动生成getter方法的实现
</code></pre><p> 4). 希望@synthesize不要自动生成私有属性,getter/setter的实现中操作我们写好的属性.</p>
<pre><code>a. 语法
    @synthesize @property 名称 = 已经存在的属性名;
    示例： @synthesiez age = _age;
    a). 不会再生成私有属性
    b). 直接生成getter/setter的实现.
    setter实现: 把参数的值直接赋值给指定的属性.
    getter的实现: 直接返回指定的属性的值.
</code></pre><p> 5). 注意：</p>
<pre><code>a. 如果直接写一个@synthesize
    @synthesize name;
b. 如果指定操作的属性.
    @synthesize name = _name;
c. 生成的setter方法实现中没有任何逻辑验证,生成的getter方法的实现中式直接返回属性的值
d. 如果要有自己的逻辑验证,需要自己实现.
</code></pre><p> 6). 批量声明</p>
<pre><code>a. 如果多个@property的类型一致,可以批量声明.
@property float height,weight;
b. @synthesize批量写, @synthesize name = _name, age = _age;
</code></pre></li>
<li><p>@property增强<br> 1). 从4.4之后, 对@property做了增强.<br> 2). 只需要写一个@property，编译器就会自动的生成私有属性、生成getter/setter的声明、生成getter/setter的实现.<br> 3). @property NSString *name;</p>
<pre><code>a. 自动的生成一个私有属性, 属性的类型和@property类型一致，属性的名称和@property的名称一致，属性的名称自动的加下划线
b. 自动的生成getter/setter的声明
c. 自动的生成getter/setter的实现
    setter的实现直接将参数的值赋值给自动生成的私有属性.
    getter的实现直接返回私有属性的值.
</code></pre><p> 4). 使用注意</p>
<pre><code>a. @property的类型一定要和属性的类型一致,名称要和属性的名称一致
b. 可以批量声明
</code></pre></li>
<li><p>动态类型和静态类型<br>1). OC是一门若语言,编译器在编译的时候，检查的时候没有那么严格.<br>优点：灵活<br>缺点：太灵活</p>
<p>强类型的语言: 编译器在编译的时候做语言检查的时候，非常严格.<br>2).     </p>
<pre><code>a. 静态类型：指的是一个指针指向的对象是一个本类对象，
b. 动态类型: 指的是一个指针指向的对象不是本类对象。
</code></pre><p>3). 编译检查：编译器在编译的时候，能不能通过1个指针去调用指针指向的对象的方法.</p>
<pre><code>判断原则:看这个指针所属的类型之中是否有这个方法，如果有就认为可以调用，编译通过,如果没有就报错。
</code></pre><p>4). 运行检查: 编译检查只是骗过了编译器，但是这个方法究竟能不能执行还不一定，运行时会去检查对象当中是否有这个方法</p>
</li>
<li><p>NSObject是OC中所有类的基类,根据LSP NSObject指针就可以指向任意的OC对象，所有NSObject指针时一个万能指针.可以指向任意的OC对象.<br>缺点: 如果要调用指向的子类对象的独有的方法，就必须要就类型的强转。</p>
</li>
<li><p>id指针是一个万能指针，可以指向任意的OC对象.<br>1). id是一个typedef类型，在定义的时候已经加<em>了，所以声明id指针的时候就不需要加</em>了<br>2). id指针是一个万能指针，任意的OC对象都可以指。<br>3). NSObject与id</p>
<pre><code>相同点: 万能指针，都可以指向任意的OC对象
不同点: 通过NSObject指针去调用对象的方法的时候，编译器会做编译检查.通过id类型的指针去调用对象方法的时候，不会报错.
</code></pre><p>4). 注意：id指针只能调用方法，不能使用点语法</p>
</li>
<li><p>instancetype<br>1). 如果方法的返回值是instancetype代表方法的返回值是当前类的对象.</p>
<pre><code><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">// 声明</span><br><span class="line">- (instancetype)person;</span><br><span class="line">// 实现</span><br><span class="line">- (instancetype)person&#123;</span><br><span class="line">	return [self new];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

建议: 
    a. 如果方法内部是在创建当前类的对象，不要写死成类名[类名 new],而是用self代替类名
    b. 如果方法的返回值是当前类的对象，也不要写死了，而是写instancetype.
</code></pre><p>2). id和instancetype的区别</p>
<pre><code>a. instancetype只能作为方法的返回值，不能在其他地方使用，id既可以声明指针变量也可以作为参数，也可以作为返回值
b. instancetype是一个有类型的代表当前类的对象，id是一个无类型的指针，仅仅是一个地址，没有类型的指针
</code></pre></li>
<li><p>构造方法<br>1). 创建对象</p>
<pre><code>类名 *指针名 = [类名 new];
new 实际上是个类方法.
new方法作用：
    -&gt; 创建对象
    -&gt; 初始化对象
    -&gt; 把对象的地址返回
new方法的内部，其实是先调用alloc方法，再调用init方法
alloc方法是一个类方法，那个类调用这个方法就创建哪个类对象
init是一个对象方法，初始化对象
创建对象的完整步骤:
应该是先使用alloc创建一个对象，然后使用init初始化这个对象
Person *p1 = [Person new];
完全等价于
Person *p1 = [[Person alloc] init];
</code></pre><p>2). init方法</p>
<pre><code>作用: 初始化对象,为对象的属性赋初始值，这个init方法我们叫做构造方法
init方法做到的事情： 初始化对象.        
</code></pre><p>3). 想要让创建对象的属性的默认值不是nil,NULL，0，那么我们可以重写init方法.按照我们自己的想法为对象的属性赋值.</p>
<pre><code>重写init方法规范：
a. 必须先调用父类的init方法.
b. 调用方法初始化对象失败返回nil
c. 判断父类是否初始化成功,如果不是nil，说明初始化成功
d. 如果初始化成功,就初始化当前对象的属性
e. 最后返回self

    - (instancetype)init{
        // 初始化父类属性的值
        self = [super init];
        if(self){
            self.name = @&quot;jack&quot;;
        }
        return self;
    }
</code></pre><p>4). 自定义构造方法</p>
<pre><code>规范:
a. 返回值必须是instancetype
b. 自定义构造方法开头必须是initWith
c. 方法的实现与init的要求一样

    - (instancetype)initWithName:(NSString *)name{
        // 初始化父类属性的值
        self = [super init];
        if(self){
            self.name = name;
        }
        return self;
    }

    Dog *d1 = [[Dog alloc] initWithName:@&quot;小黄&quot;];
</code></pre></li>
<li><p>动态类型检测<br>1). 判断指针指向的对象当中，指定的方法是否可以调用</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Person *p1 = [Person new];</span><br><span class="line">BOOL isHave = [p1 responseToSelector:@selector(setName:)];</span><br></pre></td></tr></table></figure>
<p>2). 判断类方法是否可以调用<br>3). 判断对象是否为指定类对象或者子类对象</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">NSMutableString *str = [NSMutableString class];</span><br><span class="line">BOOL res = [str isKindOfClass:[NSString class]];</span><br></pre></td></tr></table></figure>
<p>4). 判断对象是否为指定类的对象(不包括子类)</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">NSMutableString *str = [NSMutableString class];</span><br><span class="line">BOOL res = [str isMemberOfClass:[NSString class]];</span><br></pre></td></tr></table></figure>
<p>5). 判断指定的类是否为另外一个类的子类</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">BOOL res = [NSMutableString isSubclassOfClass:[NSString </span><br><span class="line">class]];</span><br></pre></td></tr></table></figure>
</li>
</ol>

      
    </div>
    
    
    

    

    

    

    <footer class="post-footer">
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/blog/2018/08/06/Object-C/Objective-C-学习第二天/" rel="next" title="Objective-C-学习第二天">
                <i class="fa fa-chevron-left"></i> Objective-C-学习第二天
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/blog/2018/08/06/Object-C/Objective-C-学习第八天/" rel="prev" title="Objective-C-学习第八天">
                Objective-C-学习第八天 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          


          

  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      

      <section class="site-overview-wrap sidebar-panel sidebar-panel-active">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image"
                src="/blog/images/avatar.jpeg"
                alt="凌浩雨" />
            
              <p class="site-author-name" itemprop="name">凌浩雨</p>
              <p class="site-description motion-element" itemprop="description">专业从事于移动端开发，Android与iOS均有涉及，主做Android开发与React Native开发</p>
          </div>

          <nav class="site-state motion-element">

            
              <div class="site-state-item site-state-posts">
              
                <a href="/blog/archives/">
              
                  <span class="site-state-item-count">393</span>
                  <span class="site-state-item-name">posts</span>
                </a>
              </div>
            

            

            

          </nav>

          

          

          
          

          
          

          

        </div>
      </section>

      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright">&copy; <span itemprop="copyrightYear">2018</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">凌浩雨</span>

  
</div>


  <div class="powered-by">Powered by <a class="theme-link" target="_blank" href="https://hexo.io">Hexo</a></div>



  <span class="post-meta-divider">|</span>



  <div class="theme-info">Theme &mdash; <a class="theme-link" target="_blank" href="https://github.com/iissnan/hexo-theme-next">NexT.Pisces</a> v5.1.4</div>




        







        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>









  












  
  
    <script type="text/javascript" src="/blog/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/fastclick/lib/fastclick.min.js?v=1.0.6"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/blog/lib/fancybox/source/jquery.fancybox.pack.js?v=2.1.5"></script>
  


  


  <script type="text/javascript" src="/blog/js/src/utils.js?v=5.1.4"></script>

  <script type="text/javascript" src="/blog/js/src/motion.js?v=5.1.4"></script>



  
  


  <script type="text/javascript" src="/blog/js/src/affix.js?v=5.1.4"></script>

  <script type="text/javascript" src="/blog/js/src/schemes/pisces.js?v=5.1.4"></script>



  
  <script type="text/javascript" src="/blog/js/src/scrollspy.js?v=5.1.4"></script>
<script type="text/javascript" src="/blog/js/src/post-details.js?v=5.1.4"></script>



  


  <script type="text/javascript" src="/blog/js/src/bootstrap.js?v=5.1.4"></script>



  


  




	





  





  












  





  

  

  

  
  

  

  

  

</body>
</html>
